Play Saudade here. The standalone downloads for Windows, Mac, and Linux offer better texture quality, but are otherwise identical.
Saudade is a game I created in Unity3D for Global Game Jam 2013. It’s a first-person horror game where you must keep control over your heartbeat to navigate dark environments, avoid ghouls, and rescue your children. Unlike my previous GGJ, Sacrifice, my team ended up putting a heavier emphasis on establishing a mood rather than exploring a game mechanic. Be warned: this game has some scary moments and is not recommended for the faint of heart.
When my team was presented with the theme for the 2013 jam, the sound of a beating heart, I recounted the Edgar Allen Poe’s famous short story “The Tell-Tale Heart,” where a murderer is driven mad by a heartbeat sound in his house. Other members of my team were on board with the idea of creating a horror game with a mentally unsound protagonist, guided by strong emotions. We expressed this metaphor physically by making the character blind except for the light produced by her heart. Furthermore, we elected to invert some common tropes of horror video games. Instead of playing a good-natured man who battles undead hordes with a handgun, a player takes the role of a strange, weapon-less woman who must sneak small numbers of ghosts to rescue her children.
Besides the background story (which, while deeply interesting to me as an individual, isn’t really what a game jam is about), I’m pleased with Saudade because of its strong unity of theme. Light, sound, and gameplay effects are all driven by the same heartbeat, which gives players a greater impression that they’re all related. Slow, steady beats keep players feeling tense as they wind through black hallways, while the smooth transition to faster heartbeats complement the rush of brushing against a ghost or running to the end of a level. Looking at the process of working during this jam, I was able to use Unity’s component-based architecture as message broadcasting to keep different behaviors of the main character maintainable and independent.
As an example, the player has the following 17 script components:
- CharacterMotion, allowing the player to move with the keyboard
- FirstPersonPerspective, allowing the player to move the camera with the mouse
- ObjectHolder, allowing the player to pick up, hold, and throw objects
- EnemyToPlayerBehavior, an interface for enemies to interact with the player (for example, dealing damage to them)
- HeartbeatTimer, modulating the player’s heartbeat intervals based on a “panic level” and sending heartbeat messages to other scripts
- HeartbeatDecay, which reduces the player’s panic level in calm situations
- HeartbeatSound, which plays a sound clip for each heart beat
- HeartbeatLight, which adjusts the player’s light source on each heart beat
- FearReceiver, which checks for nearby “scary things” and adjusts the player’s panic accordingly
- PlayerHealth, which tracks the player’s life
- PainVisual, which creates a tunnel-vision effect when the player loses health
- DeathBehavior, which plays a cinematic fade-to-white when the player dies
- PlayerUtterance, which provides an interface for playing voice clips depending on the player’s progress through the game
- PeriodicUtter, which plays an utterance after a randomized delay
- GaspOnHeartDrop, which plays a sigh of relief when the player gets out of a scary situation
- PauseBehavior, self-explanatory
- HeartbeatMusic, which plays background music when the player’s panic level is high.
By splitting up different roles for the player object to fulfill, I was able to adjust and add new behaviors easily during the development process.
No game jam game is perfect, and I believe they are not supposed to be. A game jam is an opportunity to meet new people, to learn, to innovate, and to practice. As such, the only alteration I’ve made to this game after the jam was to add a “quit” button to the title screen of the standalone versions. Everything else is an authentic representation of what my team accomplished in 48 hours. Nonetheless, here are a few lessons I will be carrying with me into my future projects:
- Despite some optimistic notions to the contrary, the Unity asset server is the only viable way to collaborate on Unity projects. I believe you can make this easier with MonoBehaviors that add and customize other MonoBehaviors to a GameObject, but complex scene building or prefab customization would still be quite difficult. I recommend any jammer who wants to use Unity keep an eye out for the limited-time Pro licenses that Unity often issues for these events and set an asset server up on one of your development machines.
- It’s definitely possible to make a game consisting of a few constructed levels in a game jam. You’re not limited to procedural content or “level-less” games.
- There’s very likely some efficient way to balance the volume of 30+ audio files and controlling the relative volume of them within the game engine, but I’m not sure what it is. Until I find out, I apoligize for the too-quiet voice acting.
- Be careful about what your game’s metaphor suggests about its gameplay. Saudade is most effective at creating a scary mood when players are still figuring out what they need to do. However, a lot of strategies that aren’t very effective (namely throwing crates at ghosts, hiding under tables) feel like they should be more effective because of the game’s aesthetic qualities. Some of the best tactics, like beelining for the exit with a rapid heartbeat to light your route, feel like they shouldn’t work because of the degree of slow suspense the game’s built up. I can’t say what would solve these problems in Saudade without making it a different game entirely, but it’s definitely a lens I’ll look through in future jams.
And that’s all I have to say about that. I hope you enjoy playing Saudade!
Special thanks to the members of my team:
- Kelly Snyder – Team Leader, Producer
- AJ Kolenc – Art, Music, Code
- Yardley Ingram – Art
- Matthew Guzdial – Code
And to everyone else who contributed to the project:
- Albert Torrence from the Berklee School of Music
- Voice actors Drew Carlson, Eric Bayne, Wolfgang Eastman, and Bridgette Kaufer.