Also feel free to check out my
Itch.io2025
visual novel
branching story
descision tree
tool dev
The Arrival of the Red Raven is a visual novel with a branching narrative where decisions matter.
Since I had the opportunity to work together with a talented artist and narrative designer, my main goal was to make sure they could entirely focus on their respective fields.
This left me with the task of doing everything else, particularly all the programming on my own.
Knowing this genre of games does not emphasize technical spectacle, I instead made it my mission to produce a perfectly unobtrusive and bug-free experience.
My main contributions were:
I wanted the world state to be managed as simply as possible. So I designed the system bottom-up and separated functionality as much as possible.
To this end, I used the blackboard pattern - I stored all information in a central class by associating an enum with integer values.
This way it is trivial to add new tracked state variables by editing a single file, whilst still having all the variables statically accessible at compile time, preventing key errors from the typical hashmap based approach.
This also makes formalizing preconditions and effects trivially easy to create and debug. Both are just a list of structs that check or set values from the blackboard. These are then stored in nodes in the decision tree.
Each functionality is entirely compartmentalized, only depending on itself and the rather straightforwardly implemented blackboard.
This way the call stack is shallow with only a few dependencies: When presenting a decision to the player, the current story node simply evaluates all the preconditions of its children and applies the effect of the chosen option.
In order to actually create the story the narrative designer needed straight forward to use tools with fundamental quality of life features. Luckily they were familiar with Unity, so I could implement it as an editor extension.
The simplest debug feature is an inspector for the blackboard: The world state data needs to be reassociated with human-readable names, since it is stored in an integer array accessed by enum ID. This is achieved with a procedural inspector loading the variable string from the enum.
The more important feature is the visual authoring of the story-flow in the form of a decision tree, or rather graph. This process is designed to be as similar to the standard Unity workflow as possible. Each node is a game object, visually represented by a box in the scene view, connected to its successors by an arrow and color-coded according to reachability with current world state.
Each node is selectable in the scene. Connections can be made by drag-and-drop. Conditions and Effects are simple drop-downs in lists.
As additional quality-of-life features, node children are auto-detected from the hierarchy and acyclic sections are auto-formatted into perfect trees.
2025
DOTS
ECS
space shooter
tower defense
The difference to my previous implementations is the goal of supporting upwards of thousands of enemies at once.
To that end I made use of the Data Oriented Technology Stack: ECS, JOBS, and BURST.
This allowed me to depict up to thirty thousand enemy space craft, interacting with each other, dodging obstacles, attacking the player as well as turrets. While this approach taught me a lot about data-oriented programming,
I don't see myself choosing to work with DOTS again in the near future. More tried and tested methods are much nicer to work with, where scalability is not as much of a concern.
An additional point to consider is the simple fact, that from a game design perspective, making such large masses of enemies fun to play against is quite difficult. Besides just lowering the enemy count, I also mitigated this by:
The system is based on Fly-by-wire. The player points a targeting reticle in the desired direction using standard mouse controls.
The spaceship then automatically aligns itself with the chosen flight path. This process fully respects the physical properties of the rigidbody without cheating by directly setting velocities or rotations.
The virtual flight computer takes the difference of current and desired headings, then calculates the necessary forces and torque from there, in keeping with limits put on the ships maximum thrust.
The process boils down to solving the equations of motion backwards.
In addition to the player's input, some automatic assists are considered in the calculations. If no or very little input is applied, the space ship automatically slows itself down laterally and turns towards its current travel direction. This mimics behaviour of airplanes for a more intuitive interaction.
2024
VR
final thesis
tangible
fencing
2023
stealth
shape-shifting
enemy AI
I made use of a finite state machine - with a straight forward enum-based implementation.
There is a method ChangeState(Behaviour nextBehaviour):
It sets the variables necessary for the next state. (Things such as nav mesh agent destination etc.)
Periodically the exit conditions for the current state are checked. Some examples include timeSinceStartOfBehaviour and LineOfSightToPlayer. Afterwards the state is changed accordingly.
In Update, depending on the currentState, a different method is called, which controls the actual behaviour of the enemy. For example in case of the patrol state, the distance to the next waypoint is checked and the navmesh destination is updated, if applicable.
The AI makes use of an event-based sensing system. These events are invoked, when the player exits/enters the vision cone or makes a sound within audible range. Depending on the current state, the next one is selected and transitioned to - usually investigate or combat.
The sensing works by testing range, angle, raycasts and layers. Additionally, with every state change, an event is invoked, which then informs any other components. This is used for mostly visual side effects, including emotes and audio barks.
2022
bullet hell
top-down
shooter
BOIDs
HeartAttack is a bullet-hell twin-stick-shooter with wave mechanics.
The concept was much simpler than that of many other contestants and no single aspect of our game blew the others out of the water. We won first place anyway. This taught me valuing a cohesive overall experience.
My main contributions were:
A large part of my contributions consisted of work on the game's enemy AI.
Though most of its features remain unused in-game, a slightly improved version can be found on Github.
I made use of steering behaviours - specifically an improvement on BOIDs, which are a great way to create swarming / flocking masses of enemies.
Each Update (notably, not necessarily in every frame), for every agent, every feature calculates a new desired direction based on all nearby agents. These directions are then averaged according to user-set weights, defining their behaviour.
To speed up performance, for the necessary distance checks, a spatial hashmap is used.
Agents are sorted according to their position into grid-cells, with a side-length of the vision distance of the agents.
This makes filtering out obviously out-of range agents trivial for distance-checks, as only adjacent cells need to be sampled, greatly improving performance compared to a brute-force approach.
In a later project (Terminal Rim) I revisted the topic of BOIDs and improved performance massively using DOTS.
2022
interactive fiction
satire
narrative engine
Headline is a satire game about manipulative news reporting. It puts the player in the role of a malicious newspaper editor.
While the gameplay seems fairly simple, under the hood there are some fairly complex systems controlling the narrative.
This complexity, combined with difficulties in playtesting, lead to a game unable to live up to its potential. We simply did not have the time to properly test core gameplay systems and showcase the effects of them to the player.
After a chaotic start to development I reluctantly became team lead midway through development. The game would likely have been better, if we had clear project management from the start. This way I learned the value of an organized development team.
My main contributions were:
A large part of my contributions consisted of work on the dynamic narrative systems, which controlled what direction the story takes, by selecting the next available news articles.
Due to organizational difficulties, this system had to be partially cut to fit a reduced scope. Under the hood my original implementation works similarly to the dialog system of Firewatch and valve's AI-driven dynamic dialog system, outlined in these great GDC talks: 1 2
A global DataManager stores information about the player's previous involvement with specific topics and factions in a form of blackboard. These values can later be queried as preconditions for story threads or modified as direct effects of player actions.
Each news article stores mainly four things.
With all this information the StoryManager decides which articles to show next. It is based on a priority queue, containing all relevant articles.
This queue is first filtered for only articles, whose preconditions are met and then sorted based on remaining lifetime. This way currently relevant articles are shown while letting older story-threads resurface as narrative callbacks.
In case no articles qualify as relevant to the current world state, filler articles are chosen at random from a set of throwaway articles without any preconditions.
After every round the articles effects are applied to the current world state, simulating the news agency's influence on the political climate.
This then affects the available news articles in the next turn, possibly unlocking follow-up stories.
2021
social
mobile
game
quiz
UI/UX
Campus Wars is a mobile social game with the purpose of encouraging class attendance.
The app uses data from the official TUM website to divide students into teams
and then lets them "conquer" territory around the campus by taking part in course relevant quizzes.
There were fairly tight restrictions on what the game could and could not include.
Overall I believe we did a splendid job of bringing theoretical knowledge into a practical setting.
I particularly liked dabbling with mobile development, which I had rarely done before.
2021
arch viz
time travel
shaders
tool dev
Tempora Facta Casa is an exploration game with puzzle elements and the goal of communicating the visual effects of wood aging on architecture.
Through the use of time travel and carefully placed hints, the player is led through a forest village and its architecture. The game fulfills its premise fairly well and playing is overall quite fun and relaxing. The graphics are not as polished as I would have liked, both in terms of performance and visual fidelity.
My main contributions were:
Keeping track of objects in multiple time eras within the same level quickly became confusing and tedious for our level designers. To make their job easier, I created an editor window, which could selectively hide specific time lines, as well as move objects between them. This removed visual clutter of WIP levels and sped up the workflow.
A major goal of this game was to demonstrate the decay of architecture through time. The main way to achieve this was through textures. The ageing process of wood is however, specific to the surroundings of the houses. So there needed to be a way to paint on objects within the context of the scene and therefore the engine. For that purpose, I created a simple vertex painting tool with features similar to old school paint. The resulting vertex colors could then be fed into custom shaders.
In multiple places, it was necessary to smoothly blend between materials within a single mesh.
Unity has some support for this, but only for terrains and only utilising alpha blending and only blending simple textures, not PBR materials. This was not sufficient for our needs.
My improved approach relied on three steps:
At the time of the game's development, Unity did not ship with any premade water assets. Also the look we were going for was specific to a swampy biome and could not be achieved with free solutions of the time. So I created my own, with the following features: