Freakshow
Unity - Gitlab - Trello
Freakshow
Unity - Gitlab - Trello
Click here to try the game!
Overview / Goals
Freakshow is a multi-creature horror game, similar to something like FNAF or lethal company, where the player explores randomly generated levels and tries to escape before being killed. The project was initially prototyped in three weeks, then moved into full production over roughly 4 months.
The main mechanic that sets our game apart from other horror games is our game show aspect. Spectators are able to join the main player's session as 'audience members' and can spawn traps, turn off the player's flashlight and more!
My roles on the project
Flowcharts for the aggressive monsters covering their behaviors
Creature / systems design
I maintained and updated a design document shared with the rest of the team containing a list of creature ideas with their behaviors, and pros and cons
These creatures needed to feel balanced when in respect to each other so it's been important to give the player some way to deal with them that won't get them killed by another creature (for example a weeping angel type creature that you have to look at, and another creature that tries to sneak up on you = unfair)
Finding an appropriate 'cast' of monsters took awhile, and a few ended up getting dropped as they either weren't fun to play against or felt unfair.
AI & systems programming
I developed reusable AI scripts for varying patrol behaviors, while maintaining unique "personalities" for each creature.
I leveraged Unity's built-in NavMesh system to integrate dynamic pathfinding within procedurally generated levels. With this, I overcame challenges through iterative problem-solving and extensive research.
I also created an immersive player controller, featuring stamina management, crouching, and enhancements like view bobbing and strafe tilt for a polished gameplay experience.
A sped up version of this expanding patrol earlier on in the project
AI programming (cont.)
A powerful tool I created to make the enemies feel more interesting was an outward search algorithm, where creatures would expand their search from where they spawn, or after they go back to their default state.
This helped guarantee an interaction with the player, as they would end up eventually exploring every node in the made until they found the player.
Monsters and their iterations
Coward being spotted and running away
The Coward
Initial
Constantly stalks the player, but vanishes or runs away when spotted
What was changed (and why!)
Vanish/teleport was removed (felt unsatisfying or confusing to players when it would just disappear)
Run behavior was changed to picking a random point so that sometimes it would run towards the player, rather the initially running away. This helped it feel a bit more panicked, and would sometimes scare the player to see it running at them!
It maintained initial stalk behavior, but now has an aggravated state if it gets spotted too much. In this state, it stands straight up and patrols for the player. The only way to get it back to stalking is by stunning it a few times with tools or objects.
In this state, it also 'blinks' in and out of existence. This is to add more uncertainty in its movements.
This behavioral change was implemented to add more depth to its behaviors and make it feel more alive, as a big part of its initial problem was it wasn't much of a threat
The Queen
Initial
Picked one of 8 random directions to slam towards until it hit a wall or player, dealing 50 damage
What was changed (and why!)
Made it so she waits until the player gets near, then she slams towards the player
Initially, the random slams were buggy, and made the queen feel TOO unpredictable. Players wouldn't understand how it worked and since she wouldn't have much direct interaction with the player due to her completely random movement, she felt odd.
She was changed from dealing damage on contact to just stunning the player.
This was done to make her more of a nuisance than a threat, but definitely something to watch out for with other monsters around
Added a search patrol to her behaviors
Initially with the random movement, and even the non-random movement, players often failed to encounter her, so I decided to give her an expanding patrol where she would slowly explore the map after not coming in contact with the player for a while.
A player encounter with the Queen where she stuns the player
Leprechaun hunting after being stunned by the camera
The Leprechaun
Initial
Follows the player, dealing a third of their health on contact
What was changed (and why!)
Added the option for the player to be able to stun it, this was added to give purpose to all of our environmental props and to help the player navigate more safely
It now initially patrols the environment, and is only hostile if the player tries to stun it, or steal his pot o' gold
If the player stuns it, it becomes aggressive, chasing the player on sight. However, if the player steals its pot o' gold, it begins to track the player no matter where they are on the map.
These behaviors were added to give it more depth as it now feels like it makes a bit more sense being the leprechaun, rather than just a random large monster
The Gnomes
Initial
Ten gnomes spawned from one prefab, with 9 being passive and would just wander the map, and one would be hostile and attack the player on sight.
What was changed (and why!)
Removed the evil gnome
This guy was annoying in the worst ways. The point of having him was to give a sense of paranoia when seeing gnomes, but since it was hard to tell him apart, he felt too dangerous and not worth having.
Added the ability to pick up gnomes
This came from playtesting, as players could pick up items already, someone suggested picking up gnomes as well, and I thought this was a great idea. Now you're able to pick up any gnome, and can even sacrifice throw them in the gnome pit for some spare cash
Grabbing a gnome and tossing him in the gnome pit!
What I've learned from the project!
Working in a large team
I've had a minor amount of experience with this before, but a lot of issues initially arose from this around clear communication and task distribution
This was overcome through our use of Trello, better documentation, and frequent team/pod meetings. I really learned how important it was that everyone was on the same page because everyone has their own idea of what the game should be, and it's easy to get out of sync!
Continual Iteration to 'Find the fun'
This has been something that's been reinforced more and more as I continue to make more games, but the current state of the game now is pretty different from our initial idea
We scrapped tasks, a mini-map, having set level designs, and changed or got rid of a few monsters. We are continuing to iterate and change the game in ways that make it more fun to play and entertaining to watch. Even though it can be pretty tough to lose progress and have to go back and change stuff, it's so crucial for making a good final product!