Our protagonist has taken a job that will require them to take care of an old Movie Theatre
for a couple of months in a distant town far from home.
During their stay, a blizzard strikes the town trapping our protagonist inside.
The game utilizes horror elements in order to facilitate player’s immersion,
aiming to create a connection with the character’s mental stability
which will deteriorate to the lost social interaction and complete isolation.
My Role
During this project we had to deal with being the smallest team, consisting in only 4 team members.
Two of them would focus on audio, art and level design; While the other two (me included), focus on coding and design.
Throughout development I was Lead Game and Narrative Designer.
However, later on I would be covering other areas to compensate for deadlines and other obstacles.
At first I was to create a game which is fun and engaging that is also able to portray a serious narrative that
illustrates real life mental health concerns. With the use of proper research and testing I
aimed to avoid falling into one of the biggest fears of a designer while making a horror game;
Ending up with a walking simulator. With this in mind, my responsabilities where:
Conceptualize, implement, and maintain gameplay systems that achieve a fulfilling flow state,
engaging game loops, and a risk/reward balance. Developing the storyline, character back-stories, and dialogue, through scripts and
storyboards, including any relevant research.
Create and maintain comprehensive documentation (such as design outlines,
diagrams, and visual mockups) that details the triggers, interactions,
and subsequent events of specific features or aspects of gameplay.
Pitching new game ideas to team members, teachers and collaborators.
Following industry trends and good practices.
Doing quality control and prototyping.
Fair Warning
During this project we lost our lead programmer, as well as other obstacles outside our team that forced
me to cover a lot of roles within a very restrictive deadline, leading to extreme overtime. This experience tought me a lot
about different roles within a company and the importance of communication between teamates, and making sure that our goals aligned.
Proper communication would have lead to a much smaller scope and a more duable project.
I would be diving this page with the respective roles and work I accomplished during the production period.
Feel free to skip to a specific role below.
This section aims to document every system interaction between the player and the game.
Within this section, I will detail core mechanics that have specific attachment to the
theme and some basic mechanics that overall add to the experience and players engagement
to the game itself.
There where three core mechanics, which include the use of non-human companion,
phone signal simulation and a task machine.
These mechanics will be explained in more detail down below.
Alternatively you can just go directly to the GDD
Download GDD
Non-human Companion
I believed it was a good idea for the player to have a mannequin as their non-human companion. Similar
to what portal does with the heart cube or Firewatch with Forrest Byrnes.
The reasoning behind incorporating this into the game is because the game itself has no NPCs.
Giving players something they can be attached to, a behavior you would expect for a person in isolation.
After all, human beings are social creatures by nature.
To increase players interaction and connection with the inanimate object,
players will be able to find clothing items and props around the map, thus boosting exploration.
These collectibles can be used to customize their companion. Further into the game the companion
will be added to the horror aspect of the game. Disappearing one of the days and reappearing in
different rooms or in front of cameras to give the sense that its alive, making emphasis on the
characters dissociation with reality.
Signal Simulation
I think this mechanic is a more organic way to indirectly force players to explore the level.
Basically, at certain intervals the character will receive text messages from their partner,
and they will need to answer to boost the sanity levels. The reasoning behind this is related
to the impact social media has nowadays in everyday life. Being unable to reach loved ones nowadays
is a lot more anxiety inducing. This mechanic plays around with the feeling of being left behind
and makes emphasis on the distance between the character and their home.
The way the mechanic works is that there will be areas on the map where the player has
enough signal to send a message. The player will have to find these areas by paying attention
to the signal bar on their phone. The closer the player is to the rooms with signal the more
bars will appear. Having three bars will allow the player to send the message and thus boost
their sanity levels.
The areas where the signal location will be chosen at random from a selection.
These areas will have anomaly triggers that will link to the players narrative.
Task Machine
Finally, a task machine that will print out daily instructions to the player.
Once the player is done with the main task, they will need to go back to the task machine to submit
their progress and end the day. This machine will provide input to the player via audio queues
which are basic robotic noises, replacing normal dialog between them and a supervisor.
I believed that having the machine instead of an actual person giving the tasks will create
more distance between the player and human interactions.
As you can see by the engagement loop, players will end the day once they have finished all main
tasks. If the player were to interact with the machine without completing the
tasks, the machine will emit a failing sound and nothing else will happen.
At first, tasks will be mundane and normal (randomly generated from an array), but later on will
become very odd and prone to enduce insanity to the character.
User Testing
The original plan was to have user testing throughout the entirety of the production
section and final release. However due to constant delays and bugs showing up, it had to be left
out to the last sprint.
Within that sprint we tested the game in person with groups from other programs/courses.
They gave us lots of feedback which helped improve the game and how it presents itself to the user.
Unfortunately not all feedback could be addressed and there was still a lot to improve in terms of user
experience.
Audio Design
To increase the use of narrative elements, explore main character's personality and response
to the events; As well as acting as player's guidance or feedback to action they may want to
try or don't know they perform, more than 20 voice lines where written down and iterated through.
However only 16 of them were actually introduced into the game due to time restrains.
Dialogue lines that I recorded myself where mostly related to picking the wrong item, or interacting
with an object without having the correct tools, etc. Good example of these dialogues are:
"Why would someone leave this here?" (Finding a tool)
"Hello? Someone there?" (Low sanity)
"Of course... No signal" (Sending text without signal)
Programmer
I think that for the programming role it is worth adding a bit of context, since originally
I would have taken a much minor role but given some problems in development, plus lots of
delegations it ended being as big as my lead designer role in terms of work put in and my
responsibilities of the project. My role covered from simple bug fixing and managing branch
merges to fully develop and test systems.
This section will be divided into Inverse Kinematics, Post Processing,
Animation States and the Anomaly System. However, it is worth noting that I was also responsible for the
phone texting and signal system and the sanity system as well. But to keep it as short as posible I will
be covering the top four most interesting ones.
Inverse Kinematics
What you see above is an early development video of the inverse kinematics working within Unity Engine
to make the player walk up stairs.
After watching a few videos in the subject and Unity's Documentation, I was able to generate somewhat of a working and believable walk
that will bend the player's knee and position the foot's angle and position based on the
distance they had to the floor. Thus, instead of hovering over objects they will realistically
stand on them. I can recommend the following video which I used as a guide:
Inverse Kinematics Video.
However, lack of experience utilizing Inverse kinematics pushed me to find a different
soulution to allow the character to distinguish objects on different heights using raycasting.
Post processing
The way I utilized Post Processing during development had a drastic change half way into the project.
Originally it consisted in having two cameras stacked on top of each other.
One would render UI elements and objects I would like to highlight and keep unchanged by the grayscale
or other effect, while the rest would be influenced by them. When HDRP was introduced,
I was quickly introduced to a new problem.
This meant that camera stacking was no longer possible and the tools used to create volumes was
different and more complex (mostly had more options and settings).
Post-Processing was changed once more when, suggested by the lecturers, that the effects would
start to show up as the sanity decreases. Thus, making the sanity system clearer to the player
and not loosing the detail on the assets made by other team members in the process.
Anomaly System
Rapidly having an event system via delegate to manage Sanity levels, while those who require values form
it to act as listeners, thus avoiding overflowing the Update method and improve frames,
allowed me to spend more time on the Anomaly system.
I first created a handler, which would have a reference to each anomaly in the scene and would trigger one at
random within a designated amount of time which could vary depending on the current in-game day or difficulty.
I also created certain checks to prevent the same anomaly triggering multiple times and an enumerator to
distinguish between different anomaly types.
Use of Polymorphism
The Anomaly class is an abstract class that inherits from the Interactable class.
This allows me to create multiple different version that override the main class's functions.
The main reason why I used an abstract class was to be able to trigger anomalies directly by just
having the reference to the abstract class instead of having different lines of codes to do the same
thing over and over to different classes.
Within this class, I state a few different things that are
essential for all anomaly types. This being a Trigger, Fix, isActive (to check whether it has been
triggered before or not) and references to its original and current state to be able to fix them later
or keep them persistent through scene changes.
Animation States
I started by gathering animations from Mixamo, which facilitated the rigging process since it does
the rigging for you. Some manual adjustments were needed inside the editor but the whole importing
was pretty fast and quite efficient.
Setting up the animator to properly flow between one state to another proved to be a bit more
challenging than what I thought. At first I decided to implement a Blend Tree which would allow
me to quickly and naturally transition from one animation to another. The way I decided to
implement it, was by mapping the player's input number (basically if he is moving forward or
backwards -1 to 1 or left to right -1 to 1). This number was generated by the engine depending
on the player's hold of the corresponding key.
For running and interacting I just had a check whether the player is holding the respective or not,
and for idle animations I had a timer that would trigger if the player wasn't tiggering any command.
In addition I also added different variations to give a bit more life to the character,
which would also vary depending on their current sanity.
After a lot of iterations and remakes, the flow chart ended up looking like the one below.
Modeling & Animation
What started being just a minor aid to our Lead Artist, since I had to wait until some mechanics were incorporated
through code to continue with testing and Design Documentation, ended up being an extended amount of work through animation tweaking,
to modeling and adapting the system to the new movement controls created by our Lead Programmer. However, much of the work was scraped due to inexperience and time restrains.
However I thought it would be worth addressing what I learned and my process.
Main Character
The idea behind the character was to keep the polygon look that old
games used to have but with a slightly increase of quality of visuals.
I started by placing anatomically references of our main character's shape.
Then continued by modifying a cube to look like the torso.
I managed to do this by moving the vertices to the correct positions and
then adding more lines as the modelled required more detail.
Then I extrude parts of the torso to transform them into extremities. This new meshes would then be
mirrored using Blender's Mirror modifier which really sped up the process. Once this was finished,
I followed with making the mesh smoother.
However it would later be pointed out to me, by our Digital Sculpting teacher that I have overlooked some key
elements to make a good model. Looking at all the work needed to be done, plus the time restrains, I decided to
go for a much simpler option; Creating a character model using Fuse (a 3D modeling app for quick
export of working character models).
Rigging & Texturing
Thanks to Unity's intuitive UI and some documentation reading I was able to quickly map the
bones and muscles to the character, with the help of previously utilizing Mixamo's rigging capabilities.
However, importing the character and applying the textures always seemed to have scaling problems, as well as shadding.
To make things worse, the movement system implemented caused animations to be snappy, or overall broken.
I spent a lot of hours trying to fix such problems, but every new change in the code base brought up a lot more problems.
Leading to other parts of the system being broken down such as the idle animations and the smooth transitioning
between them. From unexpected leg wiggles to complete deformations on the rigs, the system never truly work
as expected. To add to the mentioned problems, there was not enough video tutorials or documentation
that would help me find a solution within the time I had to work on it.
Other tasks, were starting to pile up and I needed to find a solution; fast.
Thus I simplified the system and lowered the amount of animations to a minimum.