Also feel free to check out my
Itch.io2026
co-op
roguelike
dungeon crawler
enemy AI
Each NPC's perception system performs line of sight checks with nearby objects
and stores the resulting information in the knowledge representation system, roughly based on the blackboard pattern.
Each NPC has a local short-term memory, and access to a squad-wide memory.
This way it can coordinate by sharing information with its squadmates, as well as accessing the shared knowledge.
For desicion making both sources of truth are aggregated, prioritising most recent facts.
Facts whose source has stopped updating them gradually fade, until they are deleted.
For desision making, the state machine queries the NPCs knowledge, tests conditions of transitions and then executes the state's behaviour.
For maximum reusability, state management is abstracted into a general-case state-machine.
It provides event-based transition effects for visualizing the desicion process.
It provides pre-written gizmos and access to Unity's gizmos for debug.
And it provides type-based state indexing for compile-time garantees when accessing states.
Each state is its own class, tightly coupled to only the state machine and nothing else.
The combined systems are likely more sophisticated than was needed for the behaviours that ultimately ended up in the game, and could have supported more complex enemies.
It is a fun technical achievement anyway, though not all features are used to their fullest.
The NPCs in this game transition between following a leader guarding patrol points, direct combat and investigating last-known player positions.
Occasionally they become fearful or switch allegiances or go berserk.
Based on rigorous profiling, I managed to increase the number of NPCs at a stable framerate tenfold. The game can now run up to 200 NPCs even on weaker hardware and without resorting to data-driven design or multithreading.
To achieve a high sense of polish in the style of arcade games, I implemented a game juice effect suite.
Several GDC talks served as reference:
1
2
3
4.
The custom camera system is essentially a one-to-one implementation from the talk by Squirrel Eiserloh.
It dynamically frames points of focus of the level in the cameras view, by solving by intersecting the area of viable camera positions.
It then calculates the weighted average position within those constraints and determines zoom level. Additionally the camera's view is smoothed using asymptotic averaging.
Finally both translational and rotational screenshake is applied, using non-linear trauma with linear decay and inverse-square spatial falloff.
Another bespoke effect is a full-transform secondary-motion system.
Objects are trivially animated with procedural follow-through using damped oscillation and/or asymptotic smoothing.
The system provides functions for each of the numeric types, wrapped as a monad for maximum portability and ease of use.
This is used for example in the UI for menus and health bars, which wiggle, buldge, and move using these systems.
Yet another system handles the lifecycle of VFX, such as particles and decals.
It is a per-prefab object pool with a least-recently-used cache.
This reduces the allocation and garbage collection overhead during instatiation/dustruction
and thus the performance impact of often recurring effects.
It also makes the VFX semi-permanent, aiding in design considerations such as wayfinding.
2026
VR
tangible
co-op
motion controls
House Renovator VR is an immersive cozy 'House Flipper'-style VR game.
The project was a great opportunity to work with an international team from TU Graz.
The focus of the Munich-based team members was the interaction design.
To facilitate maximum immersion, we created a custom 3d-printed multi-use tangible / controler.
Each in-game tool has custom interaction mechanics to sell the illusion, whilst encouraging full-body motion.
My main contributions were:
2025
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.
In a later project (CAMELS) I revisted state machines and created a much more sophisticated implementation.
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: