Joseph Horak - Re:Fresh Case Study
Role: Narrative and System Designer and Programmer, Writer
Link to Project: https://rhia-a.itch.io/re-fresh
Link to Team Production Bible: https://miro.com/app/board/uXjVPTyRRFs=/?share_link_id=144212619683
Process Video:
Breakdown:
Narrative Design and Writing
At the beginning of the project, we had to sit down and decide how we wanted the narrative to be delivered and what we wanted the overall feel of the world. We knew we wanted to go with a Solarpunk aesthetic and create a futuristic vision focusing on nature over industry. The quests would be focused on helping the villagers of this town, and there would be no violence or ways for the player to fail in their objectives.
My biggest inspirations as a designer and writer were games like A Short Hike, Death Stranding, and A Night in the Woods. These games are very character-driven, meaning they each have basic starting concepts that achieve emotional depth through varied interactions. Not only would each character have a distinct tone and voice, but they would each clearly serve a purpose within the community. We didn’t just want the player to be rewarded with visual upgrades to the town as they helped rebuild it but also wanted the player to feel they were helping important villagers.
Systems Design and Programming
As our ideas for the game’s narrative evolved, so did the way we needed our narrative and quest system to work. Because of the simultaneous development of these two aspects of the game, I developed a work loop where we would come up with a quest that we wanted to make, then we would write the Yarn nodes necessary for the quest, then add them onto our custom dialogue and quest system to create any functionality that we may have been missing.
The basis of dialogue is our Yarns. Yarns are text files that are split up into nodes, each of which has a unique title. Each node has its own lines of dialogue and any possible method calls or jump statements. Method calls are used to trigger C# methods from within a Yarn, and jump statements tell Yarn which node to play next.
Here’s an example of one of our Yarn nodes from early in the game. It starts with a method call (<<setVoice “Jojo_”>>) that tells our Audio system which voice SFX to play. It then starts by displaying a line before going into dialogue options (each of which is designated by the - > symbol). Finally, it tells the Yarn to jump to the next node in the conversation (<<jump Yuri_Quest_Intro>>).
Our narrative system is built off of YarnSpinner, which is a dialogue tool created by Secret Labs. Basically, the way it works is that we have Dialogue Runner component that holds the Yarn project, which holds each individual Yarn within it. The Dialogue Runner handles communication between the Yarn Project and our custom Line Views (components for displaying dialogue lines) and Option List Views (components for displaying dialogue options).
Each Quest NPC has a Character Interaction component which holds a Scriptable Object with all their quest info (which Yarn nodes to run, what the requirements for the quest are, etc.). When the player enters the NPC’s interaction trigger and presses the interact button, the Character Interaction script tells the Dialogue Runner to begin running whatever Yarn node is defined in the scriptable object. This system has allowed us to quickly develop quests by simply writing the dialogue and then creating a Quest Scriptable Object. Finally, once all is implemented, here is how a dialogue interaction looks in game: