Monochrome Horror

November 2021






portrait

A take on the psychological horror genre that sees a series of disturbing events unravel in a remote eastern-European village, all from the perspective of a child. Going into this project, I had a few specific things I wanted to achieve. Firstly, I wanted to make the game feel very retro and lo-fi. To help with this, I limited myself to a 1-bit palette (i.e. only black and white) when creating assets for the game. The second thing I aimed to do was develop my knowledge of shaders. The final thing I hoped to do was effectively create tension and atmosphere in the game through sound design. With these goals in mind, I began to build the world for my child protagonist.






Origins


My initial inspiration for the game came from the unsettling atmosphere of Ib and the art style of Omori (although I am yet to play the game). It prompted me to test my own pixel-art skills with a 1-bit palette. After drawing up a character and a basic bedroom scene from a top-down perspective, I had started to enjoy drawing with this new limitation. At a fairly low resolution, the drawing process was almost like solving a puzzle – you were forced to exclude most details, but still keep enough to make the object recognisable. To help, the remaining details would usually be exaggerated. It occurred to me that it might be interesting to have a kind of lighting in the game.

portrait

My drawings had been in white on a black background, and the lighting would effectively just invert the colours. With white being the most prevalent colour when the screen was inverted, it would give the impression that my bedroom scene had been illuminated. Later I decided to take this further. When the character was “outside”, it didn’t really seem right to use the inverting illumination technique; It made the world feel as though it was under one massive spotlight. Instead, I created a way for specific areas of the world to be illuminated. This meant I could add light sources such as streetlamps and have them light up small regions of the outdoors, while keeping the rest of the world in the default semi-darkness. This was significantly better for the mood of the game, and I could see that having the option to create and manipulate lights in this way could be a very useful tool for building tension. I also saw how I could easily extend the lighting a bit further by having complete darkness. Then I could use the light, not to fully illuminate, but to reveal areas in the default semi-darkness. A use case for this could be when the character exploring a dark building with a flashlight. The light level for each scene is controlled by a global light level. The light objects illuminate their respective regions to a level independent of the global level.

portrait Example of the 'dark', 'semi-dark' and 'light' global light levels

Setting


The game is set in a rural village somewhere in eastern Europe. I think that the brutalist soviet-era architecture typically visible in large scale apartment blocks or factories is easily recognisable and has a kind of sad, nostalgic feel to it. Such buildings were often constructed in an attempt to develop a small town or provide more housing, but it would not always work out that way.

portrait

The resulting construction would sometimes remain unfinished or if it was completed, there would not always be people interested in living there. The town would not experience any growth and so the new construction is left as an empty concrete husk. These kinds of buildings mixed in with a number of decrepit houses and wooden sheds seemed like an effective setting for the game. After doing a bit of research, I found a small town to use as a source of inspiration. I came up with a few key locations such as a small park, a convenience store/gas station, the boy’s house, a post office, an abandoned steel plant and an apartment block. A single paved road will run through the town, with some short dirt/gravel roads branching off, similar to the veins in a leaf. I wanted to give the impression that the town was a sad, run-down place. Fences would be rickety and damaged, metal objects such as the swing set in the park would be rusted, random junk items like tyres, wood planks and drums would litter the area and tall unkept grass would grow in most places. Almost everything would appear old or damaged. As is common in most places, graffiti would appear on flat surfaces, especially in the abandoned buildings. I wanted the place to be remote, with the next nearest town many miles away. That way I can start to build a sense of hopelessness for the protagonist, like there is no way for him to escape.

Core systems


To start with, I had to create the player. The game is top-down, which meant setting up 4-directional movement and collision. The collision system is based on bounding boxes, which is important for successfully creating the illusion that the game world has 3 dimensions. Rather than covering the whole sprite as would be the case in a fully side-on platformer, the bounding box needs to be scaled to only cover the base area of the object and not include any of the object’s “height”.

portrait portrait
An example of collision with a scaled bounding-box and a full image bounding-box

To complete the illusion, objects in the game world need to have a depth assigned to them. The depth will control which object appears in front when two (or more) objects are on top of one another. This also needs to be decided dynamically as the player can move around the game world. For example if the player was to walk behind a table, the table would need to be drawn over the top of the player but if the player walks in front of the table, then the player should be drawn in front of the table. This may seem almost trivial, but because I am working in a 2-dimensional space, this 3rd dimension needs to be specifically implemented.

portrait
Toggle depth:

During this time it occurred to me that I could use the lighting method discussed earlier to hide objects. For example I could hide a key, which would be drawn in black, on the black floor of an unlit room. The player would not be able to see it (and I would also have to make sure they couldn’t do anything with it) until they turned the lights on in the room. It would be excluded from the colour inversion, therefore visible on the now white floor. The next thing I set up was a room transition system that allows the player to travel from the current room to a destination room with a fade transition. To trigger the transition, the player simply has to enter a specified region of the level. I added a feature that allowed me to choose whether the transition would occur instantly when the player entered the region, or if the player would have to press the interact key as well to trigger the transition.

This addition increased the demand for some kind of indication that an object can be interacted with. A common thing that games do to indicate this is to outline or highlight the object you can interact with when the player comes within range. However with the 1-bit palette this was not really a viable option. Instead I created a basic dialogue system so that when the player is able to interact with something, a text prompt will appear at the bottom of the screen. The prompt will vary slightly depending on the object, for example it would say “open” when near a door, or “switch” when near a light switch. Another use for the system was to add another type of interactable object to the game. This type of object simply tells you a piece of information when interacted with.

portrait

Adding this kind of object can help to build out the game world and incentivise the player to explore, as they may be rewarded with some useful information or a piece of the story. In a horror game, keeping the player in the dark about what is happening, at least to begin with, then slowly feeding them pieces of the story to put together seems like a good way to go. Rather than giving the player something to fear by clearly revealing a monster for example, I find it is much more effective to indirectly suggest the presence of something and let the player’s mind come up with their own idea of what it may be. Keeping it vague and unexplained to an extent will help build tension and uncertainty in the player because regardless of how scary a monster may look, as soon as the player has seen it then there is no more mystery, which can break the tension and immersion of the story.

Retro shaders


During development, I would regularly switch from programming to drawing assets. I began to experiment with chromatic aberration in my drawings. Chromatic aberration is a kind of distortion that occurs when a lens fails to focus all colour channels of an image in the exact same place. This results in some colour distortion around the edges of image content, usually along the x-axis. To achieve a similar effect, I would add duplicate lines on either side of the original drawing, with the left side being a bright red and the right side being a saturated cyan. The colours should be almost complete opposite hues on the colour spectrum to achieve the effect. I thought it added to the retro style I was aiming for, since old monitors and TVs would often have slight chromatic aberration on their images. Initially I planned to have the effect off by default and have it increase in strength when unnatural things started to occur in the game, as a kind of indicator.

portrait

I created a shader similar to an outline shader, except there would be no outline on the top or bottom of the sprite leaving only the outline to the left and right, which are then coloured as mentioned above. Later I discovered two free shader assets on the Gamemaker marketplace called BktGlitch and Horri-fi . These shaders offered a number of additional visual effects such as noise, jumbling, scanlines, vignette and more. After setting them up in my own project and tweaking the parameters, I decided to use the horri-fi shader to add a some subtle retro effects as I liked the feel it gave the game. I could then use the more visual-glitch-focused BktGlitch as an indicator in the way I originally intended to make it appear more “broken”. To complete the old monitor aesthetic, I also changed the aspect ratio of the game view to 4:3.

The Environment


The game was starting to come together, but I still wanted the player to have more ways to interact with the game world. The outdoor areas felt particularly lifeless, so I decided to implement grass that sways and bends when the player walks over it. Having this kind of simple interactivity can make the world seem more interesting and detailed. To create the grass, I first drew up a variety of grass sprites. I made two types of grass: short and tall. For each grass type, the sprite it used would be decided randomly upon creation and each could also be flipped horizontally for greater variety. To make it sway, I wrote a simple sprite skewing script that made the sprite bend back and forth like a metronome, except with a decreasing velocity so that it eventually stops. This would be triggered by a collision with the player object, and the direction the grass initially sways in is also set to the direction the player is travelling in so that the movement looks natural. Another thing I added to help bring the environment to life was some birds. These birds randomly switch between a few states while idle (just standing, pecking the ground, and hopping left or right) then when the player comes within a certain range of the bird, it takes off and flies away.

portrait

A final crucial aspect of all games, but especially horror, is the sound design. I had created some basic sound effects for things like doors opening and a typing sound for the dialogue system but there is much more that can be added. I have plans to add range-based sound emitters and an ambient sounds channel. There will not be any music as such because the discomfort created by lack of background music suits the game well. My next steps for the project are to create a robust sound management system and to just flesh out the game world, maybe including some puzzle elements in the game too.