Catfished - A Visual Novel Game

My Role(s)

Solo Developer

Tools

Unity, Unreal Engine 5, Figma, Fungus, Ink

Time

From 2019 - Ongoing

Team size

Solo

I wrote a novel but felt the story would be more suited in a different medium. The story? A romance between two young adults who meet through online video games. The catch? Both are male pretending to be a girl, desperate to keep that fact a secret.

Catfished is a solo passion-project I started after finishing the first story draft in 2019. The concept is to make a visual novel game that takes place on a computer desktop, the dialogue being presented through chat messages.

The project has helped me develop my skills and motivated me to keep learning and improving myself both as a person and creator.

Development

Feature brief

Catfished mainly takes place via desktop interactions, occasionally switching perspective between the two main characters. The game should show an approximation of a desktop with a couple of different window applications displaying unique data. Discord and League of Legends are the two main windows, but also a web browser.

A long journey


TLDR: Ask for help. Kill your darlings. Keep it simple.




I started out with the plan of making a visual novel retelling of the story I wrote with little deviation from the source. My ambition for the project, as it often does for creators, grew overtime. I began imagining multiple different branches and endings, more involved interactions.

The main struggle was getting stuck in my own head, afraid of seeking others input. Once I reached out for advice, I gained so much clarity from just trying to motivate and explain what I was trying to accomplish. I was trying to find solutions to features I had tacked on, but I didn’t really need.

I love the premise of the game Simulacra; the idea of going through someone’s device and trying to find clues about why they went missing and what happened to them is such an intriguing concept. But Catfished isn’t a mystery horror game, it’s a cute linear romance story. I don’t need to allow the player complete freedom and make all the apps functional with content. There’s no point to it here, just more work. It would maybe increase immersion, but it would likely serve as a distraction. I’m trying to tell a linear story, and that freedom would only introduce more issues I’d need to solve.

I’d love to tackle a game like Simulacra and the challenges that come with it one day, but Catfished is not the place for it. Realizing that and accepting that has helped remove a lot of unnecessary features I deemed must haves.

Project breakdown


The project can be broken down into 3 distinct iterations, 2 developed in Unity and the current iteration in Unreal Engine 5. Alongside that there’s the UI design journey that has taken place overtime.


To structure this site, I’ll break it into 3 different sections:
  • Fungus + Unity Iteration

  • Ink + Unity Iteration

  • Unreal Engine Iteration

FUNGUS + UNITY ITERATION

What is Fungus?

Fungus is a node based visual novel plugin for Unity with all the features to create a standard visual novel. I’ve created a short standard visual novel with the plugin previously. A key feature I hadn't attempted was extending Fungus with custom commands using C#.

I made a desktop using UI and created my own system with logic for managing the different windows. For Fungus to interact with my system I had to write custom commands that could inform my system.

Say command

The most common Fungus command. Displays text in a dialogue box with a typewriting effect. By default this command awaits user input before continuing to the next command.

I added my own code into Fungus’ Say command so I could spawn messages. The Say command takes in an optional reference to a custom dialogue box, so I created different ones depending on what message type I needed to display. Then in code I used that reference to determine what type of message should be sent, if any.





Early appearance

Each chat window had a unique looking dialogue box and choice selection to match the window.

Screenshot from early version of the game.




Screenshot from early version of the game.
Removing the dialogue box

I disliked the look of displaying the chat message in the dialogue box.

After testing without it, I came to the conclusion that without was best.





Chat Command

I made my own Say command so normal dialogue is separated from chat dialogue. This also removed the need to rely on dialogue boxes to distinguish between chat types.



Custom Chat command extending Fungus
Custom Editor

I coded a custom editor for my chat command so I could toggle the relevant variables to show based on the chat type.





Window animations


Gif showcasing the different commands working

Concluding the first iteration


Main concerns:

  • No save system

  • I don't enjoy the content workflow:

    • Creating new content is time consuming because of all the variables.

    • Difficult to navigate through the content.

    • No search functionality.

    • Editing existing content is a pain without spellchecking.

  • Exporting & importing flowcharts has major limitations:

    • Can't add or remove nodes outside engine.

    • Doesn't export my custom commands, which is 90% of the content.

INK + UNITY ITERATION

What is Ink?

Ink is a text editor with a scripting language for writing interactive stories. Has an official plugin for Unity.

Dialogue Parsing


With my main concerns for the first iteration being in regard to content creation and editing, I wanted to make sure that'd be as painless as possible going forward. For this iteration, I wrote the content in Ink, which handles the story flow and supplies my system with the next line when prompted. I do still need a way to handle that line properly. I made syntax for how to format the dialogue so I could easier parse through it in code.





More interaction


I wanted the game to feel more interactive tihs time around. Allow the player to have control and ability to explore the desktop and see more of the two main characters personalities.



I prototyped a taskbar that the player could interact with to open, bring to front and close windows with. Clicking on a window will bring it to the front. The player can also move the windows around on screen.


Windows

I use inheritance for the windows. The base window class has the functionality for moving and communicates with a Desktop manager on being placed in front.

Gif of the Ink Unity version


UI development


The UI should reflect my new design ideas of interactiveness. I started with simplifying and removed unnecessary details if the player couldn’t interact with it or gain some information from it.

A struggle I had redesigning the UI was balancing aspects of the original with a consistent design for my game. I wanted to keep the original’s more unique aspects so it's still recognizable but it shouldn’t be a rip-off.



First Figma design of Discord and League client windows

Discord Version 3
League version 3



Second Figma design of Discord and League client windows

Discord Version 3
Discord Version 3

Concluding the second iteration


I learnt a lot about project structure and got more advanced with how I handled the UI. The previous version was static whilst the current one can be rescaled if needed. I also added more animations and features to this one. The windows work and can display information properly. There’s also a basic dialogue box functionality working. What’s missing is the basic visual novel features for later in the story when I want to display character portraits.



Gif of the Ink Unity version

UNREAL ENGINE 5 ITERATION

I'm still using Ink.

UI development


Third Figma design of Discord and League client windows

Discord Version 3
League version 3



Fourth Figma design of Discord and League client windows

Discord Version 3
Discord Version 3

In engine progress


I implemented a system for handling emoji's and sending images.



Gif of the Unreal Engine version

Visual novel transitions


Gif of the visual novel scene transitions