Subject #26
Genre: Top-down adventure
Engine: PICO-8
Solo project
Development time: 2 weeks
Written for Narrative Driven Jam 2, May 2021
Theme: Unreliable Narrator
Optional sub-themes: Under da Sea, Pizza Lover, Breaking the Fourth Wall
Placement: 2nd in Story / 9th overall
Story
The Jam themes of “Unreliable narrator” and “Under da sea” immediately brought Bioshock to mind. Instead of the player discovering and exploring the underwater facility, I wanted a main character who had lived their entire life there and knew nothing of the outside world. That led to my other major inspiration, Rapunzel (more specifically, Tangled).
The story begins with Zele alone in her room, guided through her daily routine by an AI she calls Mother. Suddenly another voice breaks in: a man named Finn is trying to enter the facility. His story conflicts with Mother’s account of an apocalyptic event that trapped Zele here.
Finn is able to get Zele’s chamber open and asks her to open the sub bay so he can come in. Zele discovers that the console to open the sub bay door is broken, so she explores the facility looking for parts to repair it. Along the way, she uncovers new information about the facility and the reason she’s there, though Mother and Finn tend to disagree on its accuracy.
Ultimately, the player must decide who to trust, resulting in one of two endings.
Design
- Limited scope to a single animated character by advancing the story through interactive objects. Mother and Finn communicate with Zele from offscreen (via a radio/intercom/etc.) and this dialogue drives the narrative.
- Laid out a map with 10 rooms that become available as the player collects key cards.
- Once Zele leaves her room, she has immediate access to the Operations room, which serves as a hub and provides the gameplay goal.
- Guided the player toward story sequences by arranging interactive objects within rooms such that key items were almost never closest to the entrance.
- Indicated interactive objects with a flashing exclamation point icon so the player wouldn’t get frustrated trying to touch everything.
- Authored narrative segments to stand alone to the extent possible. This way, if the player chooses to go out of order the story still makes sense.
- Simplified inventory tracking by only allowing one key card to be found with each new level of access. The three items needed to repair the sub bay console must be tracked, but because they are unique and serve no other purpose, a flag-based counter can be used.
Implementation
All game logic is coded in Lua using PICO-8’s API. This includes game state tracking, player movement, collision detection, and UI.
From a coding perspective, I tried to make things as data-driven as possible. Each room has a data structure that indicates where the exits lead and what interactive objects are present. The objects themselves are stored in a table that includes their locations, states, and associated texts. All text is stored in a string table. A callback fires after every interaction to update the world state based on which object was activated.
The biggest request I got from the jam feedback was for a run button. One particular section of the game requires backtracking through several rooms, and players wanted to move through them more quickly. I implemented this post-jam.
Code, art, music, and sound effects were created using PICO-8’s built-in editors. I also used Paint.net and Piskel for some of the sprite work.