As lead programmer during this project my contributions were split between managerial and programming. On the managerial side I discussed and delegated tasks between us three programmers on the team, as well as acted as a bridge between our subgroup and the others on the team. Since the other two programmers had no previous experience in gameplay programming I also assisted them in finding resources and guiding them on certain problems.
On the programming side I was manly responsible for the systems connecting the other programmers' work, such as the level- and cutscene managers. Outside of this, one of my main contributions is the narrative implementation, which enabled those on the team not working in-engine to have full control of the cutscenes' animations. I also implemented the 2D artists's work into the engine, ensured the player could move and sort through the objects on the screen, and created the animations.
A key challenge in this project was designing the narrative system so that it allowed non‑programmers to control cutscene animation entirely through Yarn Spinner scripts. This required creating a unified animator setup for all characters, building custom Unity functions that Yarn could call safely, and ensuring every cutscene could be triggered dynamically.
Wizard's attendant is a short and light-hearted phishing-awareness game set in a fantasy world. The player has to figure out which emails are benevolent or see the consequenses of forwarding phising emails to their boss.
Team: 5
Duration: 16 weeks part-time (50% workload)
Engine: Unity
Repo: https://github.com/YellowFudge/PhishingGame
Keywords: Unity, C#, Animations, Narrative implementation, Non‑programmer tooling
A large part of the game takes place in cutscenes, which serve as light‑hearted breaks between levels. The cutscene shown at the beggining of each level depends on the player’s performance in the previous one, and the narrative implementation therefore had to be able to run any cutscene at any given level. Due to the project's timeframe, we chose to use and build upon Yarn spinner rather than creating something from scratch.
Since each cutscene featured a range of different characters with changing expressions, we needed to implement that logic directly into the Yarn scripts to ensure that all information was gathered in the same place. To achieve this, I used Animator override controllers to ensure every character shared the same animator set up. This foundation allowed me to create custom Unity functions for Yarn spinner to call, giving the Yarn scripts control over when characters entered or left the screen, their mood and when their talking animations triggered. This meant our non-programmers, who didn't work in-engine, could easily write and iterate on the cutscenes, since they only needed to remember nine new Yarn spinner functions.
The player had two cutscenes each level. The first was feedback from the previous level and the second information on the next level's added rules. The above Yarn script uses my functions to create the second type of cutscene, which was always delivered by the magical counterpart to IT.
The scene in-game.